home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2gem106.lzh / CRYSTAL1.06 / CMP / TDIM2 / PD / LENGTHEN.TXT < prev    next >
Encoding:
Text File  |  1993-11-05  |  2.9 KB  |  62 lines

  1.  
  2. ****************************************************************************
  3.  
  4.   Auszug aus GEMX.DEC
  5.  
  6.   PROCEDURE LENGTHEN(* ProcNum:28 *)(REAL);
  7.  
  8. ****************************************************************************
  9.  
  10. proc code, procnum = 28, entrypoint =     0H, number of bytes = 76
  11.  DECODE --------                        INSTRUCTION
  12.      0H        4E56 0000                LINK    A6,#0000H
  13.      4H        48E7 E000                MOVEM.L #E000H,-(A7)
  14.      8H        202E 0008                MOVE.L  0008(A6),D0
  15.      CH        E398                     ROL.L   #1,D0
  16.      EH        2400                     MOVE.L  D0,D2
  17.     10H        0280 00FF FFFF           ANDI.L  #00FFFFFFH,D0
  18.     16H        0282 FF00 0000           ANDI.L  #FF000000H,D2
  19.     1CH        6612                     BNE     [12H] = 00000030H
  20.     1EH        7000                     MOVEQ   #00H,D0
  21.     20H        7200                     MOVEQ   #00H,D1
  22.     22H        48EE 0003 0008           MOVEM.L #0003H,0008(A6)
  23.     28H        4CDF 0007                MOVEM.L (A7)+,#0007H
  24.     2CH        4E5E                     UNLK    A6
  25.     2EH        4E75                     RTS
  26.     30H        E68A                     LSR.L   #3,D2
  27.     32H        E288                     LSR.L   #1,D0
  28.     34H        E292                     ROXR.L  #1,D2
  29.     36H        0682 3800 0000           ADDI.L  #38000000H,D2
  30.     3CH        2200                     MOVE.L  D0,D1
  31.     3EH        E688                     LSR.L   #3,D0
  32.     40H        E699                     ROR.L   #3,D1
  33.     42H        0281 E000 0000           ANDI.L  #E0000000H,D1
  34.     48H        8082                     OR.L    D2,D0
  35.     4AH        60D6                     BRA     [D6H] = 00000022H
  36.   checksum: o.k.
  37.  
  38. ****************************************************************************
  39.  
  40.  Leider ergibt diese Proz. 'krumme' Verlängerungen
  41.  (z.B. LONG (3.200000) = 3.200000048...).
  42.  Der Grund ist das in REAL-Zahlen eingebaute arithmetische Aliasing:
  43.  In der höheren Genauigkeit gibt es natürlich i.a. Zahlen, die wesentlich
  44.  näher am wahren Wert (im Bsp.: 3.2) liegen als die der niedrigeren.
  45.  
  46.  Abhilfe: Entweder ein anderes LENGTHEN, oder folgender Vergröberungs-Trick:
  47.   (Warum das funktioniert weiß allein der große Compi...)
  48.  
  49. PROCEDURE Long (r: REAL): LONGREAL; (* Für fast 'exakte' Verl. mit Dez.-00.*)
  50.  BEGIN RETURN (LONG (r * 1.0E6) / FLOATD (1000000)) END Long;
  51.  
  52.  Sonst bliebe wohl nur noch der (ziemlich lahme) Umweg über die Dezimalen...
  53.  
  54.  Übrigens:
  55.  Die Differenz der Offsets (Bias) der Exponenten (zw. REAL & LONGREAL)
  56.  beträgt   1023 - 127 = 896 = 7 * 2^7 (daher kommt 38000000H = 0011100...).
  57.  Formate:  REAL: v,e8,f23  => Zahlbereich 2^24 ~ 16000000 => max.  7 Stellen
  58.        LONGREAL: v,e11,f52 => Zahlbereich 2^53 ~ 8* 10^15 => max. 16 Stellen
  59.  
  60. ****************************************************************************
  61.  
  62.